package com.order.interceptor;



import com.fasterxml.jackson.databind.ObjectMapper;
import com.order.service.UserService;
import com.order.utils.Result;
import com.order.utils.TokenUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;

/**
 * 权限拦截器
 * 用于拦截所有请求，验证用户是否已登录（即Token是否有效）
 */
@Component
public class AuthInterceptor implements HandlerInterceptor {

    // 注入Token工具类
    @Autowired
    private TokenUtil tokenUtil;

    // 注入用户服务
    @Autowired
    private UserService userService;

    /**
     * 在请求处理之前进行调用
     * @return true表示放行，false表示拦截
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 1. 从请求头中获取Token
        String token = request.getHeader("token");
        // 2. 检查Token是否存在
        if (token == null || token.isEmpty()) {
            // Token不存在，返回未登录错误
            return handleUnauthorized(response, "请先登录");
        }
        try {
            // 3. 从Token中获取用户名
            String username = tokenUtil.getUsernameFromToken(token);
            
            // 4. 检查用户是否存在
            if (userService.findByUsername(username) == null) {
                return handleUnauthorized(response, "用户不存在");
            }
            
            // 5. 验证Token是否有效
            if (!tokenUtil.validateToken(token, username)) {
                return handleUnauthorized(response, "登录已过期，请重新登录");
            }
            
            // 6. Token验证通过，放行请求
            return true;
        } catch (Exception e) {
            // Token解析失败，可能是Token被篡改
            return handleUnauthorized(response, "登录验证失败，请重新登录");
        }
    }

    /**
     * 处理未授权的情况，返回统一的错误响应
     */
    private boolean handleUnauthorized(HttpServletResponse response, String message) throws Exception {
        // 设置响应内容类型
        response.setContentType("application/json;charset=utf-8");
        
        // 创建错误结果对象
        Result result = Result.error(message);
        
        // 将结果对象转换为JSON字符串
        ObjectMapper objectMapper = new ObjectMapper();
        String json = objectMapper.writeValueAsString(result);
        
        // 写入响应
        PrintWriter out = response.getWriter();
        out.write(json);
        out.flush();
        out.close();
        
        // 返回false，表示拦截请求
        return false;
    }
}
    